package testes;

import static org.junit.Assert.*;

import java.text.ParseException;
import java.util.Date;

import org.junit.Test;

import banco.*;

public class TesteFuncionario {

	@Test
	public void testLogin() {
		BancoDados dadosSistema = new BancoDados();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);

		assertEquals(opcoesGUIFunc.login("csouza", "123", dadosSistema), dadosSistema.funcionarios.get(1));
	}

	@Test
	public void testFazDeposito() {
		BancoDados dadosSistema = new BancoDados();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Cliente cliente3 = new Cliente("Marcos", "Lima", 9191, data);
		dadosSistema.clientes.add(cliente3);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta1 = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);
		ContaCorrente novaConta2 = opcoesGUIFunc.criaConta(1, 9191, 500, dadosSistema);

		assertTrue(opcoesGUIFunc.fazDeposito(0, 1, 50, 1, dadosSistema));
	}
	
	@Test
	public void testEfetuaPagamento() throws ParseException {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date today = new Date();
		String data = "25062013";
		
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, today);
		dadosSistema.clientes.add(cliente2);
		Cliente cliente3 = new Cliente("Marcos", "Lima", 9191, today);
		dadosSistema.clientes.add(cliente3);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta1 = opcoesGUIFunc.criaConta(1, 999, 1000, dadosSistema);
		ContaCorrente novaConta2 = opcoesGUIFunc.criaConta(1, 9191, 5000, dadosSistema);

		assertTrue(opcoesGUIFunc.efetuaPagamento(1, 1, 0, 1, data, 100, 10, dadosSistema));		
	}
	
	@SuppressWarnings("deprecation")
	@Test
	public void testPagamentoHistoricoOperacoes() throws ParseException {
		BancoDados dadosSistema = new BancoDados();
		guiCliente opcoesGUICliente = new guiCliente();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date today = new Date();
		String data = "25062013";
				
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, today);
		dadosSistema.clientes.add(cliente2);
		Cliente cliente3 = new Cliente("Marcos", "Lima", 9191, today);
		dadosSistema.clientes.add(cliente3);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta1 = opcoesGUIFunc.criaConta(1, 999, 1000, dadosSistema);
		ContaCorrente novaConta2 = opcoesGUIFunc.criaConta(1, 9191, 5000, dadosSistema);

		boolean pagamentoEfetuado = opcoesGUICliente.efetuaPagamento(1, 1, 0, 1, data, 100, 10, dadosSistema);
		
		for (int i = 0; i < novaConta1.operacoes.size(); i++) {
			Pagamento pagamento = novaConta1.operacoes.get(i).pagamento; 
			if (pagamento.getData().getDate() == today.getDate() && 
					pagamento.getData().getMonth() == today.getMonth() &&
					pagamento.getData().getYear() == today.getYear()){
				if (pagamento.getAgenciaOrigem() == 1 && pagamento.getAgenciaDestino() == 1){
					if (pagamento.getValor() == 100 && pagamento.getMulta() == 10){
						assertTrue(pagamentoEfetuado);
						return;
					}
				}
			}
		}

		fail();		
	}		

	@Test
	public void testFazSaque() {
		BancoDados dadosSistema = new BancoDados();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);

		assertTrue(opcoesGUIFunc.fazSaque(1, 0, 50, dadosSistema));
	}
	
	@Test
	public void testFazSaqueVerificaImposto() {
		BancoDados dadosSistema = new BancoDados();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);

		float saldoAnterior = novaConta.getSaldo();
		boolean saqueEfetuado = opcoesGUIFunc.fazSaque(1, 0, 50, dadosSistema);
		
		Imposto imposto = new Imposto();		
		for (int i = 0; i < novaConta.operacoes.size(); i++) {
			float valorImposto = imposto.calculaImposto(novaConta.operacoes.get(i).saque.getValor());
			if ((novaConta.operacoes.get(i).saque.getValor() + valorImposto) == (saldoAnterior - novaConta.getSaldo())){
				assertEquals((novaConta.operacoes.get(i).saque.getValor()),50,0.01);
				return;
			}
		}		
		fail();
	}
	
	@Test
	public void testErroSaqueVerificaSaldoParaImposto() {
		BancoDados dadosSistema = new BancoDados();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);

		// Testa se o imposto está sendo retirado do valor, impedindo a transação
		assertFalse(opcoesGUIFunc.fazSaque(1, 0, 100, dadosSistema));
	}	

	@Test
	public void testFazTransferencia() {
		BancoDados dadosSistema = new BancoDados();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Cliente cliente3 = new Cliente("Marcos", "Lima", 9191, data);
		dadosSistema.clientes.add(cliente3);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta1 = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);
		ContaCorrente novaConta2 = opcoesGUIFunc.criaConta(1, 9191, 500, dadosSistema);

		assertTrue(opcoesGUIFunc.fazTransferencia(1, 1, 0, 1, 10, dadosSistema));
	}

	@Test
	public void testImprimeSaldo() {
		BancoDados dadosSistema = new BancoDados();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);
		
		opcoesGUIFunc.fazSaque(1, 0, 50, dadosSistema);

		assertTrue(opcoesGUIFunc.imprimeSaldo(0, dadosSistema));
	}

	@Test
	public void testImprimeExtrato() {
		BancoDados dadosSistema = new BancoDados();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);
		
		opcoesGUIFunc.fazSaque(1, 0, 50, dadosSistema);

		assertTrue(opcoesGUIFunc.imprimeExtrato(0, dadosSistema));
	}

	@Test
	public void testCriaConta() {
		BancoDados dadosSistema = new BancoDados();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);
		
		ContaCorrente novaConta = opcoesGUIFunc.criaConta(1, 999, 100, dadosSistema);

		assertEquals(novaConta, dadosSistema.contas.get(0));
	}

	@Test
	public void testLogout() {
		BancoDados dadosSistema = new BancoDados();
		guiFuncionario opcoesGUIFunc = new guiFuncionario();
		
		Date data = new Date();
							
		Cliente cliente1 = new Cliente();
		dadosSistema.clientes.add(cliente1);
		Cliente cliente2 = new Cliente("Jorge", "Silva", 999, data);
		dadosSistema.clientes.add(cliente2);
		Agencia agencia1 = new Agencia(1, "Centro");
		dadosSistema.agencias.add(agencia1);
		Funcionario funcionario1 = new Funcionario();
		dadosSistema.funcionarios.add(funcionario1);
		Funcionario funcionario2 = new Funcionario("Carlos", "Souza", "20/08/1981", "csouza", "123");
		dadosSistema.funcionarios.add(funcionario2);

		assertEquals(opcoesGUIFunc.logout(dadosSistema), dadosSistema.funcionarios.get(0));
	}

}
